/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.webhomesites.locacao.presenter;

import br.com.webhomesites.locacao.contracts.IDevolucaoParcComPagPresenter;
import br.com.webhomesites.locacao.contracts.IDevolucaoParcComPagView;
import br.com.webhomesites.locacao.model.*;
import br.com.webhomesites.locacao.view.DevolucaoParcComPagView;
import br.com.webhomesites.locacao.view.DevolucaoView;
import br.com.webhomesites.padrao.utils.ManipuladorDatas;
import br.com.webhomesites.padrao.utils.Strategy;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Webhome
 */
public class DevolucaoParcComPagPresenter implements IDevolucaoParcComPagPresenter {

    private ItemDevolucaoParcialModel model;
    private DevolucaoParcComPagView view;
    private LocacaoModel locacaoModel;
    private List<RenovacaoLocacaoModel> listaDevolucaoTotComRenovModel = new ArrayList<>();
    private List<ItemLocacaoModel> listaItemLocacaoModel = new ArrayList<>();
    private ItemLocacaoModel itemLocacaoModel;
    private ItemLocacaoDAO itemLocacaoDAO = new ItemLocacaoDAO();
    private RenovacaoLocacaoModel devolucaoTotComRenovModel;
    private RenovacaoLocacaoDAO devolucaoTotComRenovDAO;
    private LocacaoDAO locacaoDAO;
    private DevolucaoView devolucaoView;
    public final Strategy CONFIRMAR_STRATEGY = new ConfirmarStrategy();
    private Strategy operacao = CONFIRMAR_STRATEGY;
    DevolucaoPresenter devolucaoPresenter;
    ItensLocacaoTableModel itensLocacaoTableModel;
    DecimalFormat df = new DecimalFormat("###,###,##0.00");
    DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    boolean mostrarView = false;

    public DevolucaoParcComPagPresenter(ItemDevolucaoParcialModel model, DevolucaoParcComPagView view, LocacaoModel locacaoModel, LocacaoDAO locacaoDAO, DevolucaoPresenter devolucaoPresenter) {
        this.model = model;
        this.view = view;
        this.locacaoModel = locacaoModel;
        this.locacaoDAO = locacaoDAO;
        devolucaoTotComRenovDAO = new RenovacaoLocacaoDAO();
        this.devolucaoPresenter = devolucaoPresenter;
        listaDevolucaoTotComRenovModel = devolucaoTotComRenovDAO.findByIdLocacao(locacaoModel.getId());
        itensLocacaoTableModel = devolucaoPresenter.getDevolucaoView().getitensLocacaoTableModel();
        devolucaoView = devolucaoPresenter.getDevolucaoView();
    }

    @Override
    public void setUpViewListeners() {
        view.setConfirmarActionListener(new DevolucaoParcComPagPresenterActionListeners.ConfirmarActionListener(this));
        view.setCancelarActionListener(new DevolucaoParcComPagPresenterActionListeners.CancelarActionListener(this));
        view.setReciboActionListener(new DevolucaoParcComPagPresenterActionListeners.ReciboActionListener(this));
        view.setDescontoActionListener(new DevolucaoGenericPresenterActionListener.EnterListener(null, null, this));
        view.setDescontoFocusListener(new DevolucaoGenericPresenterActionListener.LostFocusListener(null, null, this));
        view.setDescontoPorcentoFocusListener(new DevolucaoGenericPresenterActionListener.LostFocusListener(null, null, this));
        //view.setDescontoActionListener();
    }

    public void updateViewFromRenovacaoLocacaoModel() {

        for (int i = 0; i < listaDevolucaoTotComRenovModel.size(); i++) // Percorro o Array List com o For aprimorado.  
        {
            devolucaoTotComRenovModel = listaDevolucaoTotComRenovModel.get(i);
            System.out.println("data renovação: " + devolucaoTotComRenovModel.getDataRenovacao());
        }

        view.setDataLocacao(formatter.format(devolucaoTotComRenovModel.getDataRenovacao()));
        view.setDataPrevDevolucaoAtual(formatter.format(devolucaoTotComRenovModel.getDataPrevDevolucao()));
        view.setDiasLocacaoAtual(devolucaoTotComRenovModel.getDiasLocacao());
        view.setValorTotalLocacaoPrevisto(df.format(devolucaoTotComRenovModel.getValorTotalPrevisto()));
        view.setValorDescontoValor("0.00");
        view.setValorDescontoPorcentagem("0.00");
        view.setValorTotalPagar(df.format(DevolucaoBO.calcularValorAPagar(devolucaoTotComRenovModel.getValorTotalPrevisto(), devolucaoTotComRenovModel.getDiasLocacao(), ManipuladorDatas.diferencaEntreDatas(devolucaoTotComRenovModel.getDataRenovacao(), ManipuladorDatas.getDataAtual()))));
        view.setDataPagamento(formatter.format(ManipuladorDatas.getDataAtual()));
        view.setDataDevolucao(formatter.format(ManipuladorDatas.getDataAtual()));
        view.setDiasLocacaoCalculado(ManipuladorDatas.diferencaEntreDatas(devolucaoTotComRenovModel.getDataRenovacao(), ManipuladorDatas.getDataAtual()));
    }

    public void updateViewFromLocacaoModel() {

        LocacaoModel locacaoTemporaria;

        locacaoTemporaria = DevolucaoBO.calcularDevolucaoParcialLocacao(listaItemLocacaoModel, locacaoModel);

        System.out.println("Valor total calculado: " + locacaoTemporaria.getValorTotalCalculado());

        view.setDataLocacao(formatter.format(locacaoTemporaria.getDataLocacao()));
        view.setDataPrevDevolucaoAtual(formatter.format(locacaoTemporaria.getDataPrevDevolucao()));
        view.setDiasLocacaoAtual(locacaoTemporaria.getDiasLocacao());
        view.setListaItensADevolver(listaItemLocacaoModel);
        view.setValorTotalLocacaoPrevisto(df.format(locacaoTemporaria.getValorParcialPrevisto()));
        view.setValorItemPrevisto(df.format(locacaoTemporaria.getValorParcialPrevisto()));
        view.setValorItemCalculado(df.format(locacaoTemporaria.getValorTotalCalculado()));
        view.setValorDescontoValor("0.00");
        view.setValorDescontoPorcentagem("0.00");
        view.setValorTotalPagar(df.format(locacaoTemporaria.getValorParcialCalculado()));
        view.setDataPagamento(formatter.format(ManipuladorDatas.getDataAtual()));
        view.setDataDevolucao(formatter.format(ManipuladorDatas.getDataAtual()));
        view.setDiasLocacaoCalculado(ManipuladorDatas.diferencaEntreDatas(locacaoTemporaria.getDataLocacao(), ManipuladorDatas.getDataAtual()));
    }

    @Override
    public void updateViewFromModel() {
        if (model != null) {
//            view.setValorTotalLocacao(df.format(model.getTotalLocacao()));
//            view.setValorDescontoValor(df.format(model.getDesconto()));
//            view.setValorTotalPagar(df.format(model.getTotalPago()));
        } else {
            view.clearFields();
        }
    }

    public void updateViewFromJTable() {

        listaItemLocacaoModel = itensLocacaoTableModel.getListaItemLocacaoModel(devolucaoPresenter.getDevolucaoView().linhasSelecionadasTableItens());

        if (listaItemLocacaoModel != null) {
            for (int i = 0; i < listaItemLocacaoModel.size(); i++) {
                System.out.println("Produto: " + listaItemLocacaoModel.get(i).getDescricaoItem());
            }
            //locacaoModel = DevolucaoBO.calcularDevolucaoParcial(listaItemLocacaoModel, locacaoModel);
        }

        if (listaItemLocacaoModel != null) {
            this.updateViewFromLocacaoModel();

            boolean temNaoDevolviveis = DevolucaoBO.verificarItensDevolviveisEPagaveis(listaItemLocacaoModel, locacaoModel);

            if (temNaoDevolviveis) {
                mostrarView = true;
            } else {
                JOptionPane.showMessageDialog(view, "Selecione itens passíveis de devolução e pagamento", "Informação", 2);
            }
            //locacaoView.enableBtnRemoverItem(true);
            //view.enableBtnRemover(true);  
        } else {
            JOptionPane.showMessageDialog(view, "Selecione ao menos 1 item para devolver", "Informação", 2);
            view.dispose();
            //view.enableBtnAlterar(false);  
            //locacaoView.enableBtnRemoverItem(false);
        }


    }

    public void updateModelLocacaoFromDTCPV() {
        locacaoModel.setValorPagar(view.getValorTotalPagar());
        locacaoModel.setValorTotalCalculado(view.getValorTotalPagar());
        locacaoModel.setDescontoValor(view.getValorDescontoValor());
        locacaoModel.setDescontoPorcento(view.getValorDescontoPorcentagem());

        listaItemLocacaoModel = itemLocacaoDAO.findByIdLocacao(locacaoModel.getId());

        if (DevolucaoBO.verificarDevolucaoTotal(listaItemLocacaoModel, locacaoModel)) {
            locacaoModel.setStatus("D");
            locacaoModel.setDataDevolucao((Date) ManipuladorDatas.getDataAtual());
        } else {
            locacaoModel.setStatus("P");
        }

        locacaoDAO.update(locacaoModel);
    }

    public void updateModelRenovacaoLocacaoModelFromDTCPV() {
        devolucaoTotComRenovModel.setValorPagar(view.getValorTotalPagar());
        devolucaoTotComRenovModel.setValorTotalCalculado(view.getValorTotalPagar());
        devolucaoTotComRenovModel.setDescontoValor(view.getValorDescontoValor());
        devolucaoTotComRenovModel.setDescontoPorcento(view.getValorDescontoPorcentagem());
        
        listaItemLocacaoModel = itemLocacaoDAO.findByIdLocacao(locacaoModel.getId());

        if (DevolucaoBO.verificarDevolucaoTotal(listaItemLocacaoModel, locacaoModel)) {
            devolucaoTotComRenovModel.setStatus("D");
            locacaoModel.setStatus("D");
            locacaoModel.setDataDevolucao((Date) ManipuladorDatas.getDataAtual());
            devolucaoTotComRenovModel.setDataDevolucao((Date) ManipuladorDatas.getDataAtual());
        } else {
            devolucaoTotComRenovModel.setStatus("P");
            locacaoModel.setStatus("P");
            
        }
        devolucaoTotComRenovDAO.update(devolucaoTotComRenovModel);

        locacaoDAO.update(locacaoModel);
    }

    public void updateModelItemLocacaoFromDRCPV() {

        for (ItemLocacaoModel itemDevolvido : listaItemLocacaoModel) {
            try {
                itemDevolvido.setDataDevolucao((Date) formatter.parse((view.getDataDevolucao())));
                itemDevolvido.setDataPagamento((Date) formatter.parse((view.getDataPagamento())));
                itemDevolvido.setPagamentoItem("S");
                itemDevolvido.setStatusItem("D");
            } catch (ParseException ex) {
                Logger.getLogger(DevolucaoParcComPagPresenter.class.getName()).log(Level.SEVERE, null, ex);
            }
            itemLocacaoDAO.update(itemDevolvido);
        }

    }

    @Override
    public void updateModelFromView() {
        try {
            model.setDataDevolucao((Date) formatter.parse(view.getDataDevolucao()));
            model.setDataPagamento((Date) formatter.parse(view.getDataPagamento()));
            model.setDiasCalculado(view.getDiasLocacaoCalculado());
            model.setDescontoPorcento(view.getValorDescontoPorcentagem());
            model.setDescontoValor(view.getValorDescontoValor());
            //model.setListaProdutos();
            model.setValorItensPrevisto(view.getValorItemPrevisto());
            model.setValorItensCalculado(view.getValorItemCalculado());
            model.setValorTotal(view.getValorItemPrevisto());
            model.setValorTotalPagar(view.getValorTotalPagar());
        } catch (ParseException ex) {
            Logger.getLogger(DevolucaoParcComPagPresenter.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    @Override
    public void novoDevolucaoParcComPag() {

        if (locacaoModel.getRenovacao().equals("S")) {
            updateModelItemLocacaoFromDRCPV();
            updateModelRenovacaoLocacaoModelFromDTCPV();            
        } else {
            updateModelItemLocacaoFromDRCPV();
            updateModelLocacaoFromDTCPV();            
        }

    }

    @Override
    public void habilitarEdicao(boolean arg) {

        view.enableTxtValorDesconto(arg);
        view.enableTxtValorTotalPagar(arg);
        view.enableBtnCancelar(arg);
        view.enableBtnConfirmar(arg);
        view.enableBtnRecibo(arg);
    }

    @Override
    public IDevolucaoParcComPagView getView() {
        return view;
    }

    @Override
    public ItemDevolucaoParcialModel getModel() {
        return model;
    }

    @Override
    public void setView(DevolucaoParcComPagView view) {
        this.view = view;
    }

    @Override
    public void setModel(ItemDevolucaoParcialModel model) {
        this.model = model;
    }

    @Override
    public void createView() {
        //this.();            
        this.setUpViewListeners();
        this.habilitarEdicao(true);

        view.setValorDescontoValor("0,00");
        view.setValorDescontoPorcentagem("0,00");
        view.editableTxtValorTotalPagar(false);

        if (locacaoModel.getStatus().equals("R")) {
            //updateViewFromDevolucaoTotComRenovModel();
            updateViewFromJTable();
        } else {
            updateViewFromJTable();
        }

        if (mostrarView) {
            view.packAndShow();
        }
    }

    public void setOperacao(Strategy operacao) {
        this.operacao = operacao;
    }

    public Strategy getOperacao() {
        return operacao;
    }

    private class ConfirmarStrategy implements Strategy {

        @Override
        public void execute() {
            System.out.println("ConfirmarStrategy");
            novoDevolucaoParcComPag();
        }
    }
}
